#include "utils.h"
#include "frametiming.h"
#include <iostream>

using namespace std;

Utils::Vector3::Vector3()
	: Ogre::Vector3()
{
}


Utils::Vector3::Vector3(const Ogre::Vector3& v)
	: Ogre::Vector3(v)
{
}

Utils::Vector3::Vector3(Ogre::Real x, Ogre::Real y, Ogre::Real z)
	: Ogre::Vector3(x, y, z)
{
}

void Utils::Vector3::set(Axis axis, Ogre::Real value)
{
	if(axis == Utils::X)
		x = value;
	else if(axis == Utils::Y)
		y = value;
	else if(axis == Utils::Z)
		z = value;
	
}

Ogre::Real Utils::Vector3::get(Axis axis) const
{
	if(axis == Utils::X)
		return x;
	else if(axis == Utils::Y)
		return y;
	else if(axis == Utils::Z)
		return z;
}


Utils::Vector3 Utils::Vector3::operator+(const Ogre::Vector3& v) const
{
	return Ogre::Vector3::operator+(v);
}


Utils::Vector3 Utils::Vector3::operator*(const Ogre::Real scalar) const
{
	return Ogre::Vector3::operator*(scalar);
}

void Utils::autoRotate(Axis axis, Ogre::Real rotAccel, Ogre::Real rotSpeed, Utils::Vector3 speed, Utils::Vector3 &accel)
{
	Ogre::Real velMaxAchievable = 0;
	
	
	if(speed.get(axis) == rotSpeed)
		return;
	else if(speed.get(axis) > rotSpeed)
	{
		// Reducimos la velocidad
		velMaxAchievable = speed.get(axis) - rotAccel * FrameTiming::getSingleton()->timeSinceLastFrame();
		
		if(velMaxAchievable < rotSpeed)
		{
			Ogre::Real accelVal = (rotSpeed - speed.get(axis)) / FrameTiming::getSingleton()->timeSinceLastFrame();
				accel.set(axis, accelVal);
		} else
		{
			accel.set(axis, -rotAccel);
		}
	} else
	{
		// Aumentamos la velocidad
		velMaxAchievable = speed.get(axis) + rotAccel * FrameTiming::getSingleton()->timeSinceLastFrame();
		
		if(velMaxAchievable > rotSpeed)
		{
			Ogre::Real accelVal = (rotSpeed - speed.get(axis)) / FrameTiming::getSingleton()->timeSinceLastFrame();
				accel.set(axis, accelVal);
		} else
		{
			accel.set(axis, rotAccel);
		}
	}
}
